﻿#ifndef PST_DATATRANSFORMFILTER_H
#define PST_DATATRANSFORMFILTER_H

#include <vtkTransform.h>
#include <vtkSmartPointer.h>
#include <vtkDataObject.h>
#include <vtkTransformFilter.h>

#include "IVtkFilter.h"
#include "PoseSettingData.h"

namespace pst
{
    class DataTransformFilter : public IVtkFilter
    {
    public:
        DataTransformFilter()
        {
            // 创建 vtkTransform 和 vtkTransformFilter 对象
            m_transform = vtkSmartPointer<vtkTransform>::New();
            // 初始状态为单位变换
            m_transform->Identity();
            m_transformFilter = vtkSmartPointer<vtkTransformFilter>::New();
            m_transformFilter->SetTransform(m_transform);
            m_transformFilter->SetOutputPointsPrecision(vtkAlgorithm::DOUBLE_PRECISION);
        }

        virtual void setInput(vtkDataObject* input) override
        {
            // 输入数据一般要求为 vtkPolyData，但这里让用户自己确保类型正确
            m_originalInput = input;
            m_transformFilter->SetInputData(input);
        }

        virtual vtkDataObject* getOutput() override
        {
            return m_transformFilter->GetOutputDataObject(0);
        }

        virtual void update() override
        {
            if (m_enabled)
            {
                double transX = m_pose->getTranslationX();
                double transY = m_pose->getTranslationY();
                double transZ = m_pose->getTranslationZ();
                double rotationTheta = m_pose->getRotationTheta();
                double rotationPhi = m_pose->getRotationPhi();

                // theta 旋转为绕 X 轴，phi 旋转为绕 Z 轴
                double thetaAxis[3] = { 1.0, 0.0, 0.0 };
                double phiAxis[3] = { 0.0, 0.0, 1.0 };

                double scaleFactor = m_pose->getScaleFactor();

                m_transform->Identity();

                // 1. 获取 actor 自身的几何中心
                vtkDataSet* ds = vtkDataSet::SafeDownCast(m_originalInput);
                if (!ds)
                {
                    qDebug() << "Input data is not a vtkDataSet.";
                    return;
                }

                double* center = ds->GetCenter();

                // 2. 创建 vtkTransform 对象，并设为后乘模式，保证按照添加顺序执行
                m_transform->PostMultiply();

                // 将模型平移，使其中心位于原点（Step 1）
                m_transform->Translate(-center[0], -center[1], -center[2]);

                // 执行旋转（Step 2）  
                // 注意：变换的调用顺序和乘法结合性有关，因为我们处于 PostMultiply 模式，调用顺序即变换应用顺序。
                m_transform->RotateWXYZ(rotationTheta, thetaAxis);  // 先绕 theta 方向旋转
                m_transform->RotateWXYZ(rotationPhi, phiAxis);        // 再绕 phi 方向旋转
                m_transform->Scale(scaleFactor, scaleFactor, scaleFactor);        //缩放

                // 将模型中心移回原位（Step 3）
                m_transform->Translate(center[0], center[1], center[2]);

                // 最后执行平移操作 (a, b, c)（Step 4）
                m_transform->Translate(transX, transY, transZ);

                m_transformFilter->Update();
            }
        }

        void setPoseSettingData(PoseSettingData* pose) { m_pose = pose; }
        PoseSettingData* getPoseSettingData() { return m_pose; }

    private:
        vtkDataObject* m_originalInput{ nullptr };
        vtkSmartPointer<vtkTransformFilter> m_transformFilter;
        vtkSmartPointer<vtkTransform> m_transform;

        PoseSettingData* m_pose;
    };
}

#endif
